﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
// 原题连接：https://leetcode.cn/problems/remove-zero-sum-consecutive-nodes-from-linked-list/
/*
题目描述：
给你一个链表的头节点 head，请你编写代码，反复删去链表中由 总和 值为 0 的连续节点组成的序列，直到不存在这样的序列为止。
删除完毕后，请你返回最终结果链表的头节点。
你可以返回任何满足题目要求的答案。
（注意，下面示例中的所有序列，都是对 ListNode 对象序列化的表示。）

示例 1：
输入：head = [1,2,-3,3,1]
输出：[3,1]
提示：答案 [1,2,1] 也是正确的。

示例 2：
输入：head = [1,2,3,-3,4]
输出：[1,2,4]

示例 3：
输入：head = [1,2,3,-3,-2]
输出：[1]
 

提示：
给你的链表中可能有 1 到 1000 个节点。
对于链表中的每个节点，节点的值：-1000 <= node.val <= 1000.
*/

// 开始解题：
// 方法1——暴力双层遍历
struct ListNode* removeZeroSumSublists(struct ListNode* head) {
    struct ListNode* dumbNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    if (NULL == dumbNode) {
        perror("malloc fail!\n");
        exit(-1);
    }
    dumbNode->val = 0;
    dumbNode->next = head;
    struct ListNode* cur1 = head;
    struct ListNode* pre = dumbNode;
    struct ListNode* cur2 = head;
    int sum = 0;
    while (cur1) {
        cur2 = cur1;
        sum = 0;
        while (cur2) {
            sum += cur2->val;
            if (0 == sum) {
                pre->next = cur2->next;
                break;
            }
            cur2 = cur2->next;
        }
        if (0 == sum) {
            cur1 = pre->next;
        }
        else {
            pre = cur1;
            cur1 = cur1->next;
        }
    }
    return dumbNode->next;
}